package com.zyl.pts.config.result;
import com.zyl.pts.config.enums.CodeAndMessageEnum;
import com.zyl.pts.config.enums.CodeEnums;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.StringUtils;

import java.util.function.Function;

/**
 * @Description RestFul统一返回结果封装
 * @Author 翟玉龙
 * @Date 2024/11/13
 */
@AllArgsConstructor  // 全参构造
@NoArgsConstructor   // 无参构造
@Data
public class Result<T>{

    @Schema(name = "状态码")
    private Integer code; // 定义返回状态码

    @Schema(name = "返回消息")
    private String message; // 定义返回消息

    @Schema(name = "返回数据")
    private T data; // 定义返回数据,泛型

    /**
     * 无数据返回
     * @return Result
     * @param <T> Result type
     */
    public static <T> Result <T> success() {
        return new Result<>(CodeAndMessageEnum.SUCCESS.getCode(), CodeAndMessageEnum.SUCCESS.getMessage(), null);
    }

    /**
     * 成功返回构造
     * @param data 返回数据
     * @return  Result
     * @param <T>  泛型
     */
    public static <T> Function<String, Result<T>> success(T data) {
        return (msg) ->
                new Result<>(CodeAndMessageEnum.SUCCESS.getCode(), StringUtils.hasText(msg) ? msg : "success", data);
    }
    /**
     * 成功返回构造
     * @param message 返回消息
     * @param data 返回数据
     * @return Result
     * @param <T> 泛型
     */
    public static <T> Result <T> success(String message , T data) {
        return new Result<>(CodeAndMessageEnum.SUCCESS.getCode(), message , data);
    }

    /**
     * 成功返回构造
     * @param e 通用枚举
     * @param data 返回数据
     * @return Result
     * @param <T> 泛型
     */
    public static <T> Result <T> success(CodeAndMessageEnum e , T data) {
        return new Result<>(e.getCode(), e.getMessage() , data);
    }

    /**
     * 成功返回构造
     * @param e 针对枚举
     * @param data 返回数据
     * @return Result
     * @param <T> 泛型
     */
    public static <T> Result <T> success(CodeEnums e , T data) {
        return new Result<>(e.getCode(), e.getMsg() , data);
    }

    /**
     * 成功返回构造
     * @param e 通用枚举
     * @return 空数据返回
     */
    public static Result <String> success(CodeAndMessageEnum e ) {
        return new Result<>(e.getCode(), e.getMessage() , "");
    }

    /**
     * 成功返回构造
     * @param e 针对枚举
     * @return 空数据返回
     */
    public static Result <String> success(CodeEnums e) {
        return new Result<>(e.getCode(), e.getMsg() , "");
    }

    /**
     * 失败构造返回
     * @return Result
     */
    public static Result<?> error() {
    return new Result<>(CodeAndMessageEnum.ERROR.getCode(), CodeAndMessageEnum.ERROR.getMessage(), null);
    }

    /**
     * 失败构造返回
     * @param message 返回消息
     * @return Result
     */
    public static Result <String> error(String message) {
        return new Result<>(CodeAndMessageEnum.ERROR.getCode(), message , "");
    }

    /**
     * 失败构造返回
     * @param message 返回消息
     * @return Result
     */
    public static <T> Result <T> error(String message , T data) {
        return new Result<>(CodeAndMessageEnum.ERROR.getCode(), message , data);
    }

    /**
     * 失败构造返回
     * @param code 响应码
     * @param message 返回消息
     * @return Result
     */
    public static Result <String> error(Integer code , String message) {
        return new Result<>(code , message , "");
    }

    /**
     * 失败构造返回
     * @param code 针对枚举类
     * @return Result
     */
    public static Result <String> error(CodeEnums code) {
        return new Result<>(code.getCode() , code.getMsg() , "");
    }

    /**
     * 失败构造返回
     * @param code 通用枚举类
     * @return Result
     */
    public static Result <String> error(CodeAndMessageEnum code) {
        return new Result<>(code.getCode() , code.getMessage() , "");
    }

    /**
     * 失败构造返回
     * @param code 通用枚举类
     * @return Result
     */
    public static <T> Result <T> error(CodeAndMessageEnum code, T data) {
        return new Result<>(code.getCode() , code.getMessage() , data);
    }

    /**
     * 失败构造返回
     * @param code 针对枚举类
     * @return Result
     */
    public static <T> Result <T> error(CodeEnums code, T data) {
        return new Result<>(code.getCode() , code.getMsg() , data);
    }

}
